﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
using GrayParrot.Web.Controls;
using FimetContoDeposito.DAL;
using GrayParrot.Core.Filters;
using GrayParrot.Extensions.Types;

namespace FimetContoDeposito.BLL.ResultSets
{
	public class CaricaDatiCronologiaResultSetResultSet : ResultSet<FCD_CaricaDatiCronologiaReturnModel>
	{
        public CaricaDatiCronologiaResultSetResultSet(DTParameters param, IQueryable<FCD_CaricaDatiCronologiaReturnModel> result)
            : base(param, result)
        {
        }

        public override Expression<Func<FCD_CaricaDatiCronologiaReturnModel, bool>> ApplyGeneralFilter(string searchPattern)
        {
            var predicate = PredicateBuilder.False<FCD_CaricaDatiCronologiaReturnModel>();

            if (!string.IsNullOrWhiteSpace(searchPattern))
            {
                predicate = predicate.Or(im => im.codice_articolo != null && im.codice_articolo.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.codice_fornitore != null && im.codice_fornitore.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.colore != null && im.colore.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.data_consegna != null && im.data_consegna.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.data_documento != null && im.data_documento.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.data_registrazione != null && im.data_registrazione.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.descrizione_articolo != null && im.descrizione_articolo.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.mov != null && im.mov.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.numero_documento != null && im.numero_documento.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.ragione_sociale != null && im.ragione_sociale.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.riferimento_cliente != null && im.riferimento_cliente.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.serie_famiglia != null && im.serie_famiglia.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.stato != null && im.stato.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.tipo_documento != null && im.tipo_documento.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.priorita != null && im.priorita.ToString().Contains(searchPattern));
                predicate = predicate.Or(im => im.is_xxxx != null && im.is_xxxx.ToString().Contains(searchPattern));
            }

            return predicate;
        }
        
        public override Expression<Func<FCD_CaricaDatiCronologiaReturnModel, bool>> ApplyGeneralColumnsFilter(List<string> columnSearch)
        {
            var predicate = PredicateBuilder.True<FCD_CaricaDatiCronologiaReturnModel>();

            string m_numero_documento = columnSearch[ColumnIndex];
            DateTime m_data_documento = TypeExtensions.GetValueOrDefault<DateTime>(columnSearch[ColumnIndex]);
            string m_tipo_documento = columnSearch[ColumnIndex];
            string m_ragione_sociale = columnSearch[ColumnIndex];
            string m_riferimento_cliente = columnSearch[ColumnIndex];
            DateTime m_data_registrazione = TypeExtensions.GetValueOrDefault<DateTime>(columnSearch[ColumnIndex]);
            string m_mov = columnSearch[ColumnIndex];
            DateTime m_data_consegna = TypeExtensions.GetValueOrDefault<DateTime>(columnSearch[ColumnIndex]);
            bool m_stato = TypeExtensions.GetValueOrDefault<bool>(columnSearch[ColumnIndex]);
            bool m_priorita = TypeExtensions.GetValueOrDefault<bool>(columnSearch[ColumnIndex]);
            string m_colore = columnSearch[ColumnIndex];
            string m_serie_famiglia = columnSearch[ColumnIndex];
            string m_codice_articolo = columnSearch[ColumnIndex];
            string m_descrizione_articolo = columnSearch[ColumnIndex];
            string m_isXXXX = columnSearch[ColumnIndex];

            if (m_numero_documento != default(string))
            {
                predicate = predicate.And(im => im.numero_documento.Contains(m_numero_documento));
            }
            if (m_tipo_documento != default(string))
            {
                predicate = predicate.And(im => im.id_tipo_documento.Equals(Guid.Parse(m_tipo_documento)));
            }
            if (m_ragione_sociale != default(string))
            {
                predicate = predicate.And(im => im.ragione_sociale.Contains(m_ragione_sociale));
            }
            if (m_riferimento_cliente != default(string))
            {
                predicate = predicate.And(im => im.riferimento_cliente.Contains(m_riferimento_cliente));
            }
            if (m_mov != default(string))
            {
                predicate = predicate.And(im => im.mov.Contains(m_mov));
            }
            if (m_colore != default(string))
            {
                predicate = predicate.And(im => im.colore.Contains(m_colore));
            }
            if (m_serie_famiglia != default(string))
            {
                predicate = predicate.And(im => im.serie_famiglia.Contains(m_serie_famiglia));
            }
            if (m_codice_articolo != default(string))
            {
                predicate = predicate.And(im => im.codice_articolo.Contains(m_codice_articolo));
            }
            if (m_descrizione_articolo != default(string))
            {
                predicate = predicate.And(im => im.descrizione_articolo.Contains(m_descrizione_articolo));
            }
            if (m_data_documento != default(DateTime))
            {
                predicate = predicate.And(im => im.data_documento.Equals(m_data_documento));
            }
            if (m_data_registrazione != default(DateTime))
            {
                predicate = predicate.And(im => im.data_registrazione.Equals(m_data_registrazione));
            }
            if (m_data_consegna != default(DateTime))
            {
                predicate = predicate.And(im => im.data_consegna.Equals(m_data_consegna));
            }
            if (m_stato != default(bool))
            {
                predicate = predicate.And(im => im.stato == m_stato);
            }
            if (m_priorita != default(bool))
            {
                predicate = predicate.And(im => im.priorita == m_priorita);
            }
            if (m_isXXXX != "0")
            {
                bool m_isX = false;
                if(m_isXXXX == "1")
                  m_isX = true;
                
                predicate = predicate.And(im => im.is_xxxx == m_isX);
            }
            return predicate;
        }
	}
}
